/* * Copyright (C) 2010 Daniel Jacobi * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package de.questmaster.tudmensa; import java.util.Calendar; import android.app.AlertDialog; import android.app.Dialog; import android.app.ExpandableListActivity; import android.app.ProgressDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.pm.ActivityInfo; import android.content.pm.PackageManager.NameNotFoundException; import android.database.Cursor; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.text.format.DateFormat; import android.view.ContextMenu; import android.view.GestureDetector; import android.view.GestureDetector.SimpleOnGestureListener; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.webkit.WebView; import android.widget.Button; import android.widget.ExpandableListView; import android.widget.ExpandableListView.ExpandableListContextMenuInfo; import android.widget.ImageView; import android.widget.RatingBar; import android.widget.SimpleCursorTreeAdapter; import android.widget.TextView; import android.widget.Toast; public class MensaMeals extends ExpandableListActivity { private static final int UPDATE_ID = Menu.FIRST; private static final int TODAY_ID = Menu.FIRST + 1; private static final int SETTINGS_ID = Menu.FIRST + 2; private static final int MENU_GROUP_MEAL_ID = Menu.FIRST; private static final int MENU_GROUP_MENSA_ID = Menu.FIRST + 1; private static final int MENU_SHARE_ID = ContextMenu.FIRST; private static final int MENU_VOTE_ID = ContextMenu.FIRST + 1; protected static final String VOTE_DIALOG_MEAL_ID = "meal_id"; protected static final String VOTE_DIALOG_VISUAL_ID = "vote_visual"; protected static final String VOTE_DIALOG_TASTE_ID = "vote_taste"; protected static final String VOTE_DIALOG_PRICE_ID = "vote_price"; protected static final String VOTE_DIALOG_VISUAL_CHANGE_ID = "chg_visual"; protected static final String VOTE_DIALOG_TASTE_CHANGE_ID = "chg_taste"; protected static final String VOTE_DIALOG_PRICE_CHANGE_ID = "chg_price"; protected static final String VOTE_DIALOG_DATE_ID = "meal_date"; protected static final String VOTE_DIALOG_MEAL_SCRIPT_ID = "meal_script"; public static final int ON_SETTINGS_CHANGE = 0; private MensaMealsSettings.Settings mSettings = new MensaMealsSettings.Settings(); protected MealsDbAdapter mDbHelper; private ProgressDialog mPDialog = null; private boolean mRestart = false; protected Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { if (msg.what == 0) { // progress Dialog data update mPDialog.dismiss(); // updateView after update. Don't do it for an update after startup mRestart = true; // set update time mSettings.setLastUpdate(mContext); fillData(); invokeVoteUpdater(); } else if (msg.what == 1) { // VoteHelper finished updating votes int scroll_pos = mActivity.getExpandableListView().getFirstVisiblePosition(); // update data displayed mRestart = true; fillData(); mActivity.getExpandableListView().setSelectionFromTop(scroll_pos, 0); } else if (msg.what == 2) { // VoteHelper finished sending new vote Toast.makeText(mContext, getResources().getText(R.string.dialog_vote_done), Toast.LENGTH_SHORT).show(); invokeVoteUpdater(); } } }; private Calendar mToday = Calendar.getInstance(); protected Context mContext = this; protected MensaMeals mActivity = this; private String mOldTheme; private GestureDetector gestureDetector; private Bundle mVoteDialogData; private Thread voteUpdater; /** * Copied from K9mail. * * */ public class MyGestureDetector extends SimpleOnGestureListener { private static final float SWIPE_MIN_DISTANCE_DIP = 130.0f; private static final float SWIPE_MAX_OFF_PATH_DIP = 250f; private static final float SWIPE_THRESHOLD_VELOCITY_DIP = 325f; @Override public boolean onDoubleTap(MotionEvent ev) { super.onDoubleTap(ev); if (mSettings.m_bGestures) { onClickTodayButton(null); } return false; } @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { if (mSettings.m_bGestures) { // Convert the dips to pixels final float mGestureScale = getResources().getDisplayMetrics().density; int min_distance = (int) (SWIPE_MIN_DISTANCE_DIP * mGestureScale + 0.5f); int min_velocity = (int) (SWIPE_THRESHOLD_VELOCITY_DIP * mGestureScale + 0.5f); int max_off_path = (int) (SWIPE_MAX_OFF_PATH_DIP * mGestureScale + 0.5f); try { if (Math.abs(e1.getY() - e2.getY()) > max_off_path) return false; // right to left swipe if (e1.getX() - e2.getX() > min_distance && Math.abs(velocityX) > min_velocity) { onClickNextButton(null); } else if (e2.getX() - e1.getX() > min_distance && Math.abs(velocityX) > min_velocity) { onClickPrevButton(null); } } catch (Exception e) { // nothing } } return false; } } public class CustomCursorTreeAdapter extends SimpleCursorTreeAdapter { private int[] mChildFrom; private int[] mChildTo; private int mChildLayoutUsed; public CustomCursorTreeAdapter(Context context, Cursor cursor, int groupLayout, String[] groupFrom, int[] groupTo, int childLayout, String[] childFrom, int[] childTo) { super(context, cursor, groupLayout, groupFrom, groupTo, childLayout, childFrom, childTo); mChildLayoutUsed = childLayout; mChildFrom = new int[childFrom.length]; initFromColumns(getChildrenCursor(cursor), childFrom, mChildFrom); mChildTo = childTo; } /** * Copied from SimpleCurserTreeAdapter * * @param cursor * @param fromColumnNames * @param fromColumns */ private void initFromColumns(Cursor cursor, String[] fromColumnNames, int[] fromColumns) { if (cursor != null) for (int i = fromColumnNames.length - 1; i >= 0; i--) { fromColumns[i] = cursor.getColumnIndexOrThrow(fromColumnNames[i]); } } @Override protected Cursor getChildrenCursor(Cursor groupCursor) { Cursor c = null; if (groupCursor.getCount() > 0) { String location = groupCursor.getString(groupCursor.getColumnIndex(MealsDbAdapter.KEY_LOCATION)); String date = groupCursor.getString(groupCursor.getColumnIndex(MealsDbAdapter.KEY_DATE)); String counter = groupCursor.getString(groupCursor.getColumnIndex(MealsDbAdapter.KEY_COUNTER)); if (mSettings.m_bEnableVoting) { c = new MealsDbCursorWrapper(mDbHelper.fetchMealsOfGroupDayPlusVote(location, date, counter), mContext); } else { c = new MealsDbCursorWrapper(mDbHelper.fetchMealsOfGroupDay(location, date, counter), mContext); } startManagingCursor(c); } return c; } @Override protected void bindChildView(View view, Context context, Cursor cursor, boolean isLastChild) { int[] from = mChildFrom; int[] to = mChildTo; for (int i = 0; i < to.length; i++) { View v = view.findViewById(to[i]); if (v != null) { String text = cursor.getString(from[i]); if (text == null) { text = ""; } if (v instanceof TextView) { ((TextView) v).setText(text); } else if (v instanceof ImageView) { setViewImage((ImageView) v, text); } else if (v instanceof RatingBar) { Float value = cursor.getFloat(from[i]); ((RatingBar) v).setRating(value); } else { throw new IllegalStateException("CustomCursorAdapter can bind values only to" + " RatingBar, TextView and ImageView!"); } } } } @Override public View newChildView(Context context, Cursor cursor, boolean isLastChild, ViewGroup parent) { View new_view = super.newChildView(context, cursor, isLastChild, parent); // check if data avail, if not... if (mChildLayoutUsed == R.layout.simple_expandable_list_item_2_rating) { View holder = new_view.findViewById(R.id.ratingHolder); if (cursor.getFloat(cursor.getColumnIndexOrThrow(MealsDbAdapter.KEY_RESULT_VISUAL)) < 0.5f && cursor.getFloat(cursor.getColumnIndexOrThrow(MealsDbAdapter.KEY_RESULT_PRICE)) < 0.5f && cursor.getFloat(cursor.getColumnIndexOrThrow(MealsDbAdapter.KEY_RESULT_TASTE)) < 0.5f) { // hide stuff holder.setVisibility(View.GONE); } else { // show stuff holder.setVisibility(View.VISIBLE); } } return new_view; } } /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { // Read settings mSettings.ReadSettings(this); // Setup Theme if (mSettings.m_sThemes.equals("dark")) { setTheme(R.style.myTheme); } else if (mSettings.m_sThemes.equals("light")) { setTheme(R.style.myThemeLight); } // Set Content super.onCreate(savedInstanceState); setContentView(R.layout.meals_list); registerForContextMenu(getExpandableListView()); // Init Database mDbHelper = new MealsDbAdapter(this); mDbHelper.open(); // Setup date mToday = Calendar.getInstance(); if (mToday.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY) { mToday.add(Calendar.DAY_OF_YEAR, 2); } else if (mToday.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) { mToday.add(Calendar.DAY_OF_YEAR, 1); } // Capture our buttons from layout and set them up Button buttonPrev = (Button) findViewById(R.id.btn_prev); Button buttonNext = (Button) findViewById(R.id.btn_next); buttonPrev.setBackgroundResource(R.drawable.ic_menu_back); buttonNext.setBackgroundResource(R.drawable.ic_menu_forward); Button buttonDate = (Button) findViewById(R.id.txt_date); registerForContextMenu(buttonDate); updateButtonText(); // Gesture detection gestureDetector = new GestureDetector(new MyGestureDetector()); // show help dialog int ver; try { ver = getPackageManager().getPackageInfo(getPackageName(), 0).versionCode; if (mSettings.m_iShowDialog != ver) { // load some kind of a view LayoutInflater li = LayoutInflater.from(this); View view = li.inflate(R.layout.help_dialog, null); // TODO let webview look like a dialog -> set as activity WebView wv = (WebView) view.findViewById(R.id.help_dialog_message); wv.loadUrl(getResources().getString(R.string.help_dialog_msg)); AlertDialog.Builder d = new AlertDialog.Builder(this); d.setTitle(getResources().getString(R.string.help_dialog_title)); d.setIcon(android.R.drawable.ic_menu_info_details); d.setView(view); d.show(); mSettings.setLastDialogShown(this); } } catch (NameNotFoundException e) { // Nothing to do } } @Override public boolean dispatchTouchEvent(MotionEvent ev) { super.dispatchTouchEvent(ev); return gestureDetector.onTouchEvent(ev); } @Override public boolean onCreateOptionsMenu(Menu menu) { boolean result = super.onCreateOptionsMenu(menu); MenuItem mItem = null; mItem = menu.add(0, UPDATE_ID, 0, R.string.menu_update); mItem.setIcon(R.drawable.ic_menu_refresh); mItem = menu.add(0, TODAY_ID, 1, R.string.menu_today); mItem.setIcon(android.R.drawable.ic_menu_today); mItem = menu.add(0, SETTINGS_ID, 2, R.string.menu_settings); mItem.setIcon(android.R.drawable.ic_menu_preferences); return result; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case UPDATE_ID: getData(); fillData(); break; case TODAY_ID: onClickTodayButton(null); break; case SETTINGS_ID: Intent iSettings = new Intent(); iSettings.setClass(this, MensaMealsSettings.class); startActivityForResult(iSettings, ON_SETTINGS_CHANGE); // To be able to check for new data if mensa changed. mRestart = false; // Store old theme mOldTheme = mSettings.m_sThemes; break; } return super.onOptionsItemSelected(item); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case ON_SETTINGS_CHANGE: mSettings.ReadSettings(this); // WORKAROUND: restart activity TODO may have side-effects in froyo if (!mOldTheme.equals(mSettings.m_sThemes)) { setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); //setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED); } // Reread data and display it updateButtonText(); fillData(); break; } } @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { super.onCreateContextMenu(menu, v, menuInfo); if (v instanceof ExpandableListView) { ExpandableListView.ExpandableListContextMenuInfo info = (ExpandableListView.ExpandableListContextMenuInfo) menuInfo; int type = ExpandableListView.getPackedPositionType(info.packedPosition); // Only create a context menu for child items if (type == ExpandableListView.PACKED_POSITION_TYPE_CHILD) { menu.setHeaderTitle(getResources().getString(R.string.contextmenu_meals)); menu.add(MENU_GROUP_MEAL_ID, MENU_SHARE_ID, 0, getResources().getString(R.string.contextmenu_share_with_friends)); if (mSettings.m_bEnableVoting && (mToday.before(Calendar.getInstance()) || mToday.equals(Calendar.getInstance()))) { menu.add(MENU_GROUP_MEAL_ID, MENU_VOTE_ID, 1, getResources().getString(R.string.contextmenu_vote)); } } } else if (v instanceof Button) { menu.setHeaderTitle(getResources().getString(R.string.pref_MensaLocationLabel)); int pos = 0; for (String loc : getResources().getStringArray(R.array.MensaLocations)) { menu.add(MENU_GROUP_MENSA_ID, pos, pos, loc); pos++; } } } @Override public boolean onContextItemSelected(MenuItem item) { if (item.getGroupId() == MENU_GROUP_MEAL_ID) { ExpandableListContextMenuInfo info = (ExpandableListContextMenuInfo) item.getMenuInfo(); // Pull values from the array we built when we created the list // String Cursor c = mDbHelper.fetchMeal(info.id); startManagingCursor(c); // get info String meal = c.getString(c.getColumnIndex(MealsDbAdapter.KEY_NAME)); String mensa = c.getString(c.getColumnIndex(MealsDbAdapter.KEY_LOCATION)); switch (item.getItemId()) { case MENU_SHARE_ID: Intent share = new Intent(Intent.ACTION_SEND); share.setType("text/plain"); share.putExtra(Intent.EXTRA_SUBJECT, String.format(getResources().getString(R.string.share_subject), DateFormat.getDateFormat(this).format(mToday.getTime()))); share.putExtra(Intent.EXTRA_TEXT, String.format(getResources().getString(R.string.share_checkout), meal, DateFormat.getDateFormat(this).format(mToday.getTime()), getMensaLocationString(mensa))); startActivity(Intent.createChooser(share, getResources().getString(R.string.share_where_to))); return true; case MENU_VOTE_ID: long meal_id = c.getLong(c.getColumnIndex(MealsDbAdapter.KEY_ROWID)); String meal_num = c.getString(c.getColumnIndex(MealsDbAdapter.KEY_MEAL_NUM)); String counter = c.getString(c.getColumnIndex(MealsDbAdapter.KEY_COUNTER)); float vis = c.getFloat(c.getColumnIndex(MealsDbAdapter.KEY_VOTE_VISUAL)); float tst = c.getFloat(c.getColumnIndex(MealsDbAdapter.KEY_VOTE_TASTE)); float prc = c.getFloat(c.getColumnIndex(MealsDbAdapter.KEY_VOTE_PRICE)); mVoteDialogData = new Bundle(); mVoteDialogData.putLong(VOTE_DIALOG_MEAL_ID, meal_id); mVoteDialogData.putString(VOTE_DIALOG_MEAL_SCRIPT_ID, (mensa + "|" + counter + "|" + meal_num).replaceAll(" ", "_")); mVoteDialogData.putString(VOTE_DIALOG_DATE_ID, "D" + DateFormat.format("yyyyMMdd", mToday.getTime())); mVoteDialogData.putFloat(VOTE_DIALOG_VISUAL_ID, vis); mVoteDialogData.putFloat(VOTE_DIALOG_TASTE_ID, tst); mVoteDialogData.putFloat(VOTE_DIALOG_PRICE_ID, prc); showDialog(R.layout.rating_dialog); return true; } } else if (item.getGroupId() == MENU_GROUP_MENSA_ID) { // set Mensa location mSettings.setMensaLocation(mContext, getResources().getStringArray(R.array.MensaLocationsValues)[item.getItemId()]); // Reread data and display it updateButtonText(); fillData(); } return super.onContextItemSelected(item); } /** * {@inheritDoc} */ protected Dialog onCreateDialog(int id) { Dialog dialog = null; if (id == R.layout.rating_dialog) { AlertDialog.Builder d = new AlertDialog.Builder(this); d.setTitle(getResources().getString(R.string.dialog_title_voting)); // create view LayoutInflater factory = LayoutInflater.from(this); final View ratingView = factory.inflate(R.layout.rating_dialog, null); d.setView(ratingView); d.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { float visual = 0, price = 0, taste = 0; boolean vis_set = false, prc_set = false, tst_set = false; dialog.dismiss(); // get dialog data, only the new stuff RatingBar r = (RatingBar) ratingView.findViewById(R.id.visual); if (!r.isIndicator()) { visual = r.getRating(); vis_set = true; mVoteDialogData.putFloat(VOTE_DIALOG_VISUAL_ID, visual); } else { visual = mVoteDialogData.getFloat(VOTE_DIALOG_VISUAL_ID); } mVoteDialogData.putBoolean(VOTE_DIALOG_VISUAL_CHANGE_ID, vis_set); r = (RatingBar) ratingView.findViewById(R.id.price); if (!r.isIndicator()) { price = r.getRating(); prc_set = true; mVoteDialogData.putFloat(VOTE_DIALOG_PRICE_ID, price); } else { price = mVoteDialogData.getFloat(VOTE_DIALOG_PRICE_ID); } mVoteDialogData.putBoolean(VOTE_DIALOG_PRICE_CHANGE_ID, prc_set); r = (RatingBar) ratingView.findViewById(R.id.taste); if (!r.isIndicator()) { taste = r.getRating(); tst_set = true; mVoteDialogData.putFloat(VOTE_DIALOG_TASTE_ID, taste); } else { taste = mVoteDialogData.getFloat(VOTE_DIALOG_TASTE_ID); } mVoteDialogData.putBoolean(VOTE_DIALOG_TASTE_CHANGE_ID, tst_set); if (vis_set || prc_set || tst_set) { // Save data (DB) long rowId = mVoteDialogData.getLong(VOTE_DIALOG_MEAL_ID); mDbHelper.updateMealInternalVotes(rowId, visual, price, taste); // Save data (Inet) new VoteHelper(mActivity, mVoteDialogData).start(); } } }); d.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { dialog.cancel(); } }); dialog = d.create(); } return dialog; } protected void onPrepareDialog(int id, Dialog dialog) { if (id == R.layout.rating_dialog) { String voted = ""; // set prev vote RatingBar r = (RatingBar) dialog.findViewById(R.id.visual); if (mVoteDialogData.getFloat(VOTE_DIALOG_VISUAL_ID) != 0) { r.setIsIndicator(true); voted += getResources().getString(R.string.dialog_visual) + ", "; } else { r.setIsIndicator(false); } r.setRating(mVoteDialogData.getFloat(VOTE_DIALOG_VISUAL_ID)); r = (RatingBar) dialog.findViewById(R.id.price); if (mVoteDialogData.getFloat(VOTE_DIALOG_PRICE_ID) != 0) { r.setIsIndicator(true); voted += getResources().getString(R.string.dialog_price) + ", "; } else { r.setIsIndicator(false); } r.setRating(mVoteDialogData.getFloat(VOTE_DIALOG_PRICE_ID)); r = (RatingBar) dialog.findViewById(R.id.taste); if (mVoteDialogData.getFloat(VOTE_DIALOG_TASTE_ID) != 0) { r.setIsIndicator(true); voted += getResources().getString(R.string.dialog_taste) + ", "; } else { r.setIsIndicator(false); } r.setRating(mVoteDialogData.getFloat(VOTE_DIALOG_TASTE_ID)); // set already voted line TextView txt = (TextView) dialog.findViewById(R.id.alreadyVoted); if (voted.length() > 0) { voted = voted.substring(0, voted.length() - 2) + "."; txt.setText(String.format(getResources().getString(R.string.dialog_already_voted), voted)); } else { txt.setText(""); } } } @Override public void onGroupCollapse(int groupPosition) { // keep the Groups expanded getExpandableListView().expandGroup(groupPosition); } public void onClickTodayButton(View v) { mToday = Calendar.getInstance(); if (mToday.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY) { mToday.add(Calendar.DAY_OF_YEAR, 2); } else if (mToday.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) { mToday.add(Calendar.DAY_OF_YEAR, 1); } updateButtonText(); fillData(); } public void onClickNextButton(View v) { // Setup date mToday.add(Calendar.DAY_OF_YEAR, 1); if (mToday.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY) { mToday.add(Calendar.DAY_OF_YEAR, 2); } else if (mToday.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) { mToday.add(Calendar.DAY_OF_YEAR, 1); } // next screen updateButtonText(); fillData(); } public void onClickPrevButton(View v) { // Setup date mToday.add(Calendar.DAY_OF_YEAR, -1); if (mToday.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY) { mToday.add(Calendar.DAY_OF_YEAR, -1); } else if (mToday.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) { mToday.add(Calendar.DAY_OF_YEAR, -2); } // next screen updateButtonText(); fillData(); } @Override protected void onDestroy() { super.onDestroy(); // close database mDbHelper.close(); } @Override protected void onResume() { super.onResume(); // check for database connection // maybe canceled due to low memory, etc. if (mDbHelper == null || !mDbHelper.isOpen()) { if (!mDbHelper.isOpen()) { mDbHelper.close(); } mDbHelper = new MealsDbAdapter(this); mDbHelper.open(); } invokeVoteUpdater(); // expand groups fillData(); } @Override public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) { // show Type and legend information Cursor c = mDbHelper.fetchMeal(id); startManagingCursor(c); // get info date String info = c.getString(c.getColumnIndex(MealsDbAdapter.KEY_INFO)); if (!info.equals("")) // Display Toast message Toast.makeText(this, info, Toast.LENGTH_SHORT).show(); return true; } /* * Returns Mensa Location String, if id not found in Values, the first * Location is returned.s */ private String getMensaLocationString(String id) { int pos = 0; boolean found = false; for (String s : getResources().getStringArray(R.array.MensaLocationsValues)) { if (s.equals(id)) { found = true; break; } else pos++; } if (!found) pos = 0; return getResources().getStringArray(R.array.MensaLocations)[pos]; } private void updateButtonText() { // Prepare times Calendar cPrev = (Calendar) mToday.clone(); Calendar cNext = (Calendar) mToday.clone(); cPrev.add(Calendar.DAY_OF_YEAR, -1); cNext.add(Calendar.DAY_OF_YEAR, 1); // check weekends if (cPrev.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY) { cPrev.add(Calendar.DAY_OF_YEAR, -1); } else if (cPrev.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) { cPrev.add(Calendar.DAY_OF_YEAR, -2); } if (cNext.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY) { cNext.add(Calendar.DAY_OF_YEAR, 2); } else if (cNext.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) { cNext.add(Calendar.DAY_OF_YEAR, 1); } // // Update Text Prev // Button buttonPrev = (Button) findViewById(R.id.btn_prev); // String textPrev = // DateFormat.getDateFormat(this).format(cPrev.getTime()); // buttonPrev.setText(textPrev.substring(0, textPrev.length() - 5)); // // // Update Text Next // Button buttonNext = (Button) findViewById(R.id.btn_next); // String textNext = // DateFormat.getDateFormat(this).format(cNext.getTime()); // buttonNext.setText(textNext.substring(0, textNext.length() - 5)); // Set new title + Update label TextView labelDay = (TextView) findViewById(R.id.txt_date); labelDay.setText(getMensaLocationString(mSettings.m_sMensaLocation) + "\n" + DateFormat.format("EEEE", mToday.getTime()) + ", " + DateFormat.getDateFormat(this).format(mToday.getTime())); } private boolean doMondayUpdate() { Calendar oNow = Calendar.getInstance(); // time till last update long lDiff = oNow.getTimeInMillis() - mSettings.m_lLastUpdate; // Update is older then a week if (lDiff / 86400000.0 > 7.0) return true; // get last Monday Calendar oLastMonday = Calendar.getInstance(); oLastMonday.add(Calendar.DAY_OF_MONTH, -1); while (oLastMonday.get(Calendar.DAY_OF_WEEK) != Calendar.MONDAY) { oLastMonday.add(Calendar.DAY_OF_MONTH, -1); } // lastUpdate is older than last monday if (mSettings.m_lLastUpdate < oLastMonday.getTimeInMillis()) { return true; } return false; } private void fillData() { // check for database connection // maybe canceled due to low memory, etc. if (mDbHelper == null || !mDbHelper.isOpen()) { if (!mDbHelper.isOpen()) { mDbHelper.close(); } mDbHelper = new MealsDbAdapter(this); mDbHelper.open(); } // prepare date string String date = (String) DateFormat.format("yyyyMMdd", mToday); // Get all of the notes from the database and create the item list Cursor c = mDbHelper.fetchGroupsOfDay(mSettings.m_sMensaLocation, date); startManagingCursor(c); // if none found start a new query automatically, also on each monday if (mSettings.m_bAutoUpdate && !mRestart && (c.getCount() == 0 || doMondayUpdate())) { mRestart = true; getData(); return; } // startManagingCursor(c); String[] group_from = new String[] { MealsDbAdapter.KEY_COUNTER }; int[] group_to = new int[] { R.id.counter }; // Now create an array adapter and set it to display using our row CustomCursorTreeAdapter meals; if (mSettings.m_bEnableVoting) { String[] child_from = new String[] { MealsDbAdapter.KEY_NAME, MealsDbAdapter.KEY_PRICE, MealsDbAdapter.KEY_TYPE, MealsDbAdapter.KEY_RESULT_VISUAL, MealsDbAdapter.KEY_RESULT_PRICE, MealsDbAdapter.KEY_RESULT_TASTE }; int[] child_to = new int[] { R.id.meal, R.id.price, R.id.meal_type, R.id.vote_visual, R.id.vote_price, R.id.vote_taste }; meals = new CustomCursorTreeAdapter(this, c, R.layout.simple_expandable_list_item_1, group_from, group_to, R.layout.simple_expandable_list_item_2_rating, child_from, child_to); } else { String[] child_from = new String[] { MealsDbAdapter.KEY_NAME, MealsDbAdapter.KEY_PRICE, MealsDbAdapter.KEY_TYPE }; int[] child_to = new int[] { R.id.meal, R.id.price, R.id.meal_type }; meals = new CustomCursorTreeAdapter(this, c, R.layout.simple_expandable_list_item_1, group_from, group_to, R.layout.simple_expandable_list_item_2, child_from, child_to); } setListAdapter(meals); // expand all items for (int i = 0; i < c.getCount(); i++) { getExpandableListView().expandGroup(i); } } private void getData() { mPDialog = ProgressDialog.show(this, null, getResources().getString(R.string.dialog_updating_text), true, true); // get data DataExtractor de = new DataExtractor(this, mSettings.m_sMensaLocation); Thread t = new Thread(de); t.start(); } /** * */ private void invokeVoteUpdater() { // start getting new votes if (voteUpdater == null || !voteUpdater.isAlive()) { voteUpdater = new VoteHelper(mActivity, mDbHelper); voteUpdater.start(); } } }